#ifndef SMOOTHER
#define SMOOTHER
//------------------------------------------------------------------------
//
//  Name: Smoother.h
//
//  Desc: Template class to help calculate the average value of a history
//        of values. This can only be used with types that have a 'zero'
//        value and that have the += and / operators overloaded.
//
//        Example: Used to smooth frame rate calculations.
//
//  Author: Mat Buckland (fup@ai-junkie.com)
//
//------------------------------------------------------------------------
#include <vector>

template < class T >
class Smoother
{
  private:

    //this holds the history
    std::vector < T > m_History;

    int m_iNextUpdateSlot;

    //an example of the 'zero' value of the type to be smoothed. This
    //would be something like Vector2D(0,0)
    T m_ZeroValue;

  public:

    //to instantiate a Smoother pass it the number of samples you want
    //to use in the smoothing, and an exampe of a 'zero' type
    Smoother( int SampleSize,
              T ZeroValue )
        : m_History( SampleSize,
                     ZeroValue ),
          m_iNextUpdateSlot( 0 ),
          m_ZeroValue( ZeroValue )
    {
    }

    //each time you want to get a new average, feed it the most recent value
    //and this method will return an average over the last SampleSize updates
    T Update( const T& MostRecentValue )
    {
      //overwrite the oldest value with the newest
      m_History[m_iNextUpdateSlot++] = MostRecentValue;

      //make sure m_iNextUpdateSlot wraps around.
      if ( (unsigned int) m_iNextUpdateSlot == m_History.size() ) m_iNextUpdateSlot =
          0;

      //now to calculate the average of the history list
      T sum = m_ZeroValue;

      typename std::vector < T >::iterator it;
      for ( it = m_History.begin(); it != m_History.end(); ++it ) {
        sum += *it;
      }

      return sum / (double) m_History.size();
    }
};

#endif
